package site.tagtype.base;

import java.util.ArrayList;
import java.util.List;

public abstract class BaseTag {
	// 确定标签之间的关系

	// 树

	// 该标签的子标签
	private List<BaseTag> childTags = new ArrayList<BaseTag>();
	// 该标签的内容
	private String tagPre;
	private String tagLast;
	// 标签的属性
	private String[] tagProperties;
	
	private boolean flag = false;
	// 如果专门写一个标签，继承该类，则flag为true用data
	// 如果简单用SimpleBaseTag，则flag为false用dataString
	private Object data;		//
	private String dataString = "";	//

	// 构造方法
	/*-----------------------------------------------------------------------*/
	// 检查、过虑传入的标签是否合法
	// eg.tag: html

	
	// 标签体用dataString
	public BaseTag(String tag, String dataString) {
		this.setTag(tag);
		this.dataString = dataString;
	}
	
	// 标签体默认用dataString
	public BaseTag(String tag) {
		this.setTag(tag);
	}
	
	// 标签体默认用dataString
	public BaseTag() {
		
	}

	// 配置本标签信息
	/*-------------------------------------------------------------------------*/

	protected void setFlag(boolean flag) {
		this.flag = flag;
	}
	
	// 直接传入一个标签,如：html
	protected void setTag(String tag) {
		// 检查tag
		// ...
		this.tagPre = "<" + tag + ">";
		this.tagLast = "</" + tag + ">";
		// if(tag.matches("<.{*}>")) {
		// this.tagPre = tag;
		// this.tagLast = tag.replace("<", "</");
		// }
	}

	public void addChild(BaseTag baseTag) {
		childTags.add(baseTag);
	}

	public void setDataString(String dataString) {
		this.dataString = dataString;
	}
	
	// 将data对象转化为String
	public abstract String getDataDIY();

	// 查询本标签的一些属性信息
	/*-------------------------------------------------------------------------*/
	public String getTagPre() {
		return tagPre;
	}

	public String getTagLast() {
		return tagLast;
	}

	public boolean isLeaf() {
		return (childTags.size() == 0) ? true : false;
	}

	public String getDataString() {
		return dataString;
	}

	// 包括标签，标签内的内容(如果有的话)，子标签
	// 返回方式
	// 先返回本标签的data再遍历子标签
	public String getAllTagData() {
		StringBuffer dataBuffer = new StringBuffer();
		dataBuffer.append(tagPre + "\n");
		dataBuffer.append((flag) ? ("\n" + this.getDataDIY()) : ("\n" + this.getDataString()));
		for (BaseTag bt : childTags) {
			dataBuffer.append(bt.getAllTagData());
		}
		dataBuffer.append(tagLast + "\n");
		return dataBuffer.toString();
	}

}
